package concurrent;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * 同步阻塞队列，SynchronousQueue没有容量，与其他BlockingQueue不同，
 * SynchronousQueue是一个不存储元素的BlockingQueue，每一个put操作必须要等待一个take操作，
 * 否则不能继续添加元素，反之亦然。SynchronousQueue 在现实中用的不多，线程池中有用到过，
 * Executors.newCachedThreadPool()实现中用到了这个队列，当有任务丢入线程池的时候，
 * 如果已创建的工作线程都在忙于处理任务，则会新建一个线程来处理丢入队列的任务。
 *
 * @author jack.wu
 * @since 2019/12/23 13:43
 */
public class SynchronousQueueTest {

    static SynchronousQueue<String> queue = new SynchronousQueue<>();

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            long startTime = System.currentTimeMillis();
            try {
                queue.put("消息");
                long endTime = System.currentTimeMillis();
                System.out.println(String.format("[%s，%s，take耗时：%s，线程名称：%s]",
                        startTime, endTime, (endTime - startTime), Thread.currentThread().getName()));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();
        TimeUnit.SECONDS.sleep(4);
        System.out.println(System.currentTimeMillis() + "调用take获取并移除元素," + queue.take());
    }
}
